# -*- coding: utf-8 -*-
import re
from lr.register.models import Profile, Invite
from lr.face.forms import NameField
from django.contrib.auth.models import User
from django import forms


class RegisterForm(forms.Form):
    """ Форма регистрации нового пользователя """
    invite = forms.CharField(max_length=19, required=False, widget=forms.TextInput, label=u'Код вашего Приглашения')
    username = NameField(max_length=30, min_length=3, widget=forms.TextInput, label=u'Логин для входа на сайт')
    password1 = forms.CharField(max_length=127, min_length=6, widget=forms.PasswordInput(render_value=True),
                                label=u'Пароль для входа на сайт')
    password2 = forms.CharField(max_length=127, min_length=6, widget=forms.PasswordInput(render_value=True),
                                label=u'Подтверждение пароля (пароль еще раз)')
    email = forms.EmailField(label=u'E-mail')
    last_name = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Фамилия')
    first_name = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Имя')
    patronymic = NameField(max_length=30, required=False, widget=forms.TextInput, label=u'Отчество')
#    birthday = forms.RegexField(regex=ur'^\d{1,2}\.\d{1,2}\.\d{4}$', required=False, error_message=u'Неверный формат даты.',
#                                widget=forms.TextInput, label=u'День рожденья (дд.мм.гггг)')
#    gender = forms.ChoiceField(choices=Profile.GENDER_CHOICES, initial=u'x', label=u'Пол')
#    userpic = forms.FileField(label=u'Аватар', widget=forms.ClearableFileInput)
    
    
#    def clean_birthday(self):
#        """ Функция проверки правильности ввода даты """
#        birth = self.cleaned_data.get('birthday', '')
#        d = re.search(ur'^(?P<day>\d{1,2})\.(?P<month>\d{1,2})\.(?P<year>\d{4})$', birth)
#        if d:
#            day = int(d.group('day'))
#            month = int(d.group('month'))
#            year = int(d.group('year'))
#            try:
#                datetime.date(year, month, day)
#            except:
#                raise forms.ValidationError(u'Введена несуществующая дата.')
#            return u'%d.%.2d.%d' % (day, month, year)
#        return birth
#    
#    
#    def clean_userpic(self):
#        """ Функция проверки аватара """
#        userpic = self.cleaned_data.get('userpic', None)
#        if not userpic.content_type.lower() in [ 'image/jpeg', 'image/png', 'image/gif' ]:
#            raise forms.ValidationError(u'Формат изображения должен быть JPG, PNG или GIF.')
#        return self.cleaned_data
    
    
    def clean_invite(self):
        """ Проверка на наличие приглашения в системе """
        invite = self.cleaned_data['invite']
        if invite:
            # Найти пригласившего
            keys = re.search(ur'^(?P<k0>[0-9\u0041-\u0046]{4})\-(?P<k1>[0-9\u0041-\u0046]{4})\-(?P<k2>[0-9\u0041-\u0046]{4})\-(?P<k3>[0-9\u0041-\u0046]{4})$',
                             invite)
            if keys:
                k0 = int('0x' + keys.group('k0'), 16)
                k1 = int('0x' + keys.group('k1'), 16)
                k2 = int('0x' + keys.group('k2'), 16)
                k3 = int('0x' + keys.group('k3'), 16)
            else:
                raise forms.ValidationError(u'Неверный формат кода.')
            
            invites = Invite.objects.filter(key0=k0, key1=k1, key2=k2, key3=k3).only('owner')
            if len(invites) == 0:
                raise forms.ValidationError(u'Код приглашения не найден.')
    
    
    def clean_username(self):
        """ Функция проверки уникальности логина """
        users = User.objects.filter(username=self.cleaned_data['username']).only('username')
        if len(users) > 0:
            raise forms.ValidationError(u'Такой логин уже зарегистрирован.')
        return self.cleaned_data
        
    
    def clean(self):
        """ Функция проверки данных, введенных в форму регистрации """
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError(u'Пароль не прошел подтверждение.')
        return self.cleaned_data
    
    
    def save(self, username, password, invite, email, nickname,
             first_name, patronymic, last_name, send_email=True):
        """ Создает нового юзера с неподтвержденным аккаунтом """
        return Profile.objects.create_user(username=username, password=password,
                                           invite=invite, email=email, nickname=nickname,
                                           first_name=first_name, patronymic=patronymic,
                                           last_name=last_name, send_email=send_email)
        
